use rocket::serde::{Deserialize, Serialize};
use rocket::serde::json::Json;
use rocket_okapi::okapi::schemars;
use rocket_okapi::okapi::schemars::JsonSchema;
use crate::extends::core::errors::response_code_enums::ResponseCodeEnum;

/// 泛型结构体 `R<T>` 用于封装响应数据
#[derive(Debug, Deserialize, Serialize, JsonSchema)]
#[serde(crate = "rocket::serde")]
pub struct R<T> {
    #[schemars(description = "响应状态码")]
    pub code: u16,

    #[schemars(description = "响应消息，若为空则不序列化该字段")]
    #[serde(skip_serializing_if = "String::is_empty")]
    pub msg: String,

    #[schemars(description = "响应数据，可以为空")]
    pub data: Option<T>,
}

impl<T> R<T> {
    /// 成功时的响应构造函数
    ///
    /// # 参数
    /// * `data` - 泛型数据类型，可以为任意类型或空
    ///
    /// # 返回值
    /// 返回一个 `Json<R<T>>` 对象，包含成功的响应信息
    pub fn success(data: Option<T>) -> Json<R<T>> {
        let response_code = ResponseCodeEnum::SUCCESS.to_response();
        Json(R::<T> {
            code: response_code.code,
            msg: response_code.msg,
            data
        })
    }


    /// 失败时的响应构造函数
    ///
    /// # 参数
    /// * `code_enum` - 响应状态枚举
    /// * `data` - 泛型数据类型，可以为任意类型或空
    ///
    /// # 返回值
    /// 返回一个 `Json<R<T>>` 对象，包含失败的响应信息
    pub fn error(code_enum: ResponseCodeEnum) -> Json<R<T>> {
        let response_code = code_enum.to_response();
        Json(R::<T> {
            code: response_code.code,
            msg: response_code.msg,
            data: None
        })
    }
}
